#include "BilMsg.h"
#include "QPythonCall.hpp"
// By Zero123

BilMsg::UserMesg::UserMesg(const nlohmann::json& data)
{
	text = data.value("text", "");
	uid = data.value("uid", 0);
	nickname = data.value("nickname", "unknow");
	timeline = data.value("timeline", "---");
	isadmin = data.value("isadmin", 0);
	onlyUid = nickname + timeline;
}

nlohmann::json BilMsg::UserMesg::getJson() const
{
	return nlohmann::json{
		{"text", text},
		{"nickname", nickname},
		{"isadmin", isadmin},
	};
}

BilMsg::MsgManager::MsgManager(unsigned int maxCacheCount)
{
	this->maxCacheCount = maxCacheCount;
}

void BilMsg::MsgManager::loadMsg(const UserMesg& msg)
{
	// 受弹幕表会保留历史弹幕影响 需实现缓存和剔除
	addMsg(msg);
	if(msgCache.size() > maxCacheCount)
	{
		// 超过最大缓存数据 回收消息
		freeLastMsg();
	}
}

bool BilMsg::MsgManager::hasMsg(const UserMesg& msg) const
{
	if (msgCacheSet.find(msg.onlyUid) != msgCacheSet.end())
	{
		return true;
	}
	return false;
}

void BilMsg::MsgManager::addMsg(const UserMesg& msg)
{
	if (hasMsg(msg))
	{
		return;
	}
	msgCacheSet.insert(msg.onlyUid);
	msgCache.push_back(msg.onlyUid);
	updateMsg(msg);
}

void BilMsg::MsgManager::freeLastMsg()
{
	const auto& first = msgCache[0];
	msgCacheSet.erase(first);
	msgCache.pop_front();
}

void BilMsg::MsgManager::updateMsg(const UserMesg& msg)
{
	// 消息通信 提交到Python进程
	QIPC::call("GET_MSG", msg.getJson());
}